vlwkaos' digital garden

TypeScript - 조건부 type정의시 infer

infer는 조건부 타입을 보완할때 사용. extends 바깥에서 사용할 수 없다.

예시: ReturnType은 함수가 반환하는 타입으로 변환

type a = ReturnType<() => void> // void
type b = ReturnType<() => string | number> // string | number

어떻게 정의하는지 살펴보자

type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any; // R

정의할 때 선언한 타입 말고 구현부에서 사용되는 타입을 가져다 쓸 때 유용하다.

<T>를 도중에 조건부에서 일시적으로 선언하여 사용하는 것이라고 보면 될 듯.

use cases

Function's first/second argument:

type FirstArgOfFunc<T> = T extends (
    first: infer F,
    ...args: any[]
) => any 
    ? F 
    : never;

type SecondArgOfFunc<T> = T extends (
    first: any,
    second: infer S,
    , ...args: any[]
) => any 
    ? S 
    : never;

Array Type

type ArrayType<T> = T extends (infer Item)[] ? Item : T
TypeScript - 조건부 type정의시 infer